﻿using System;
using System.Collections.Generic;
using Roborally.Bord;
using Roborally.CommonData.Enums;
using Roborally.CommonData.GlobaleTypes;

namespace Roborally.Server
{
    public class Kamer
    {
        private Controller controller;
        private string hostnaam;
        private string kamernaam;
        private string bordstring;
        private List<int> spelerIDs = new List<int>();
        private bool spelgestart = false;

        public Controller Controller
        {
            get { return controller; }
        }
        
        public string KamerNaam
        {
            get { return kamernaam; }
        }

        public string BordString
        {
            get { return bordstring; }
        }
        
        public List<int> SpelerIDs
        {
            get { return spelerIDs; }
        }
        
        public bool SpelGestart
        {
            get { return spelgestart; }
        }

        public Kamer(string Hostnaam, int Hostid, string Kamernaam, string Args)
        {
            this.hostnaam = Hostnaam;
            this.kamernaam = Kamernaam;
            spelerIDs.Add(Hostid);
            this.bordstring = Args;
            //Console.WriteLine("bordString ontvangen van kamer: " + Kamernaam);
        }

        public bool JoinKamer(int spelerID)
        {
            if (!spelerIDs.Contains(spelerID))
            {
                if (spelerIDs.Count < 8)
                {
                    if (!SpelGestart)
                    {
                        spelerIDs.Add(spelerID);
                        return true;
                    }
                }
            }
            return false;
        }

        public void LeaveKamer(int spelerID)
        {
            for (int i = 0; i < spelerIDs.Count; i++)
            {
                if (spelerIDs[i] == spelerID)
                {
                    spelerIDs.Remove(spelerIDs[i]);
                }
            }
        }

        public void StartNieuwSpel()
        {
            NieuwSpelGegevens spelGegevens;
            spelGegevens = new NieuwSpelGegevens();

            IBord gekozenBord = MaakBord(this.bordstring);

            for (int i = 0; i < this.SpelerIDs.Count; i++)
            {
                spelGegevens.SpelerIDEnNaam.Add(this.SpelerIDs[i], Manager.Instance.SpelerByID(this.SpelerIDs[i]).SpelerNaam);
                spelGegevens.DicIDRobotType.Add(this.SpelerIDs[i], (RobotType)i+1);
                Console.WriteLine("Speler " + this.SpelerIDs[i] + " met de naam '" + Manager.Instance.SpelerByID(this.SpelerIDs[i]).SpelerNaam + "' added aan " + this.KamerNaam);
            }

            /*int aantalAI = 8 - k.SpelerIDs.Count;
            while (aantalAI > 0)
            {
                spelGegevens.SpelerIDEnNaam.Add(aantalspeleruniqueidnext++, "AI" + aantalspeleruniqueidnext);
                aantalAI--;
            }*/
            controller = new Controller(gekozenBord, spelGegevens);
            spelgestart = true;
            controller.Spelleider.StartSpel();
        }
        
        /// <summary>
        /// Maakt een instantie van een bord aan uit een string
        /// </summary>
        /// <param name="info">De string waaruit het bord gebouwd wordt</param>
        /// <returns>Het bord waarop gespeeld wordt, voor de Controller-instantiatie</returns>
        internal IBord MaakBord(string info)
        {
            info = info.Substring(10);
            int MaxX = 0;
            int MaxY = 0;
            string[] vakinfo = info.Split(new char[] { '^' }, StringSplitOptions.RemoveEmptyEntries);
            int i = 0;
            while (i < vakinfo.Length)
            {
                if (Convert.ToInt32(vakinfo[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]) > MaxX)
                    MaxX = Convert.ToInt32(vakinfo[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]);
                if (Convert.ToInt32(vakinfo[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[1]) > MaxY)
                    MaxY = Convert.ToInt32(vakinfo[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[1]);
                i++;
            }
            IVak[,] vakken = new IVak[MaxX + 1, MaxY + 1];
            i = 0;
            while (i < vakinfo.Length)
            {
                string[] delen = vakinfo[i].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                vakken[Convert.ToInt32(delen[0]), Convert.ToInt32(delen[1])] = KrijgVak(delen);
                i++;
            }
            return (new Bord.Bord(vakken));
        }

        private IVak KrijgVak(string[] delen)
        {
            bool[] muur = new bool[4];
            if (delen[5] == "1")
                muur[0] = true;
            else
                muur[0] = false;
            if (delen[4] == "1")
                muur[1] = true;
            else
                muur[1] = false;
            if (delen[7] == "1")
                muur[2] = true;
            else
                muur[2] = false;
            if (delen[6] == "1")
                muur[3] = true;
            else
                muur[3] = false;
            IVak vak = new Leeg(muur);
            switch (Convert.ToInt32(delen[2]))
            {
                case 1:
                    vak = new CheckPoint(Convert.ToInt32(delen[13]), muur);
                    break;
                case 2:
                    vak = new Draaischijf((DraaiRichting)Convert.ToInt32(delen[10]), muur);
                    break;
                case 3:
                    vak = new Expresband((BandType)(Convert.ToInt32(delen[12]) - 1), muur);
                    break;
                case 6:
                    vak = new Lopendeband((BandType)(Convert.ToInt32(delen[12]) - 1), muur);
                    break;
                case 9:
                    vak = new Valkuil(muur);
                    break;
            }
            return vak;
        }
    
    }
}